package com.itheima.features.optional.demo01;

import java.util.Optional;

/**
 * 演示：Optional类中的其他的方法
 */
public class OptionalDemo03 {

    /**
     * public T orElse(T other)                          如果存在值，则返回值，否则返回other
     * public T orElseGet(Supplier<? extends T> supplier)如果存在值，则返回值，否则返回由供应函数产生的结果
     * public void ifPresent(Consumer<? super T> action) 如果存在值，则使用该值执行给定的操作，否则不执行任何操作。
     * public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)如果存在值，则使用该值执行给定的操作，否则执行给定的基于空的操作。
     */
    public static void main(String[] args) {

        // 创建一个Student学生对象
        Student s = null ; // new Student("刘亦菲" , 18) ;

        // 使用Optional类将这个学生对象进行封装
        Optional<Student> optional = Optional.ofNullable(s);

        // public T orElse(T other)                          如果存在值，则返回值，否则返回other
        // Student student = optional.orElse(new Student("公孙瓒", 14));

        // 输出
        // System.out.println(student);

        System.out.println("---------------------------------------------------");

        // public T orElseGet(Supplier<? extends T> supplier)如果存在值，则返回值，否则返回由供应函数产生的结果
//        Student student1 = optional.orElseGet(() -> {
//            return new Student("马超", 24);
//        });

        // 输出
        // System.out.println(student1);

        System.out.println("--------------------------------------------------");

        // public void ifPresent(Consumer<? super T> action) 如果存在值，则使用该值执行给定的操作，否则不执行任何操作。
        // optional.ifPresent( student -> System.out.println(student) );

        // public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)如果存在值，则使用该值执行给定的操作，否则执行给定的基于空的操作。
        optional.ifPresentOrElse( student -> System.out.println(student) , () -> System.out.println("封装的对象为null了....") );

        System.out.println("----------------------------------------------------");

        Optional<Student> student = getStudent();
        Student student1 = student.orElse(new Student("马超", 24));
        System.out.println(student1);

    }

    public static Optional<Student> getStudent() {
        Student student = new Student();
        return Optional.ofNullable(student) ;
    }

}
